package com.xuzimian.globaldemo.spring.springwebsocket.controller;

import com.xuzimian.globaldemo.spring.springwebsocket.handler.vo.ChatMessage;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.messaging.simp.SimpMessageHeaderAccessor;
import org.springframework.messaging.simp.annotation.SendToUser;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

import java.security.Principal;

/**
 * 聊天控制器.
 * 
 * @since 1.0.0 2018年4月2日
 * @author <a href="https://waylau.com">Way Lau</a> 
 */
@Controller
public class ChatController {
    
    @GetMapping("/")
    public String index() {
        return "index";
    }
    
    @MessageMapping("/chat.sendMessage") //接口所有向 该broker发送的消息
    @SendTo("/topic/public") //将返回的消息发送给所有订阅了 "/topic/public" 主题的客户端
    public ChatMessage sendMessage(@Payload ChatMessage chatMessage) {
        return chatMessage;
    }

    /**
     * SimpMessageHeaderAccessor : weksocket 会话属性map,该map作为头附加到入站客户端信息中。
     * @param chatMessage
     * @param headerAccessor
     * @return
     */
    @MessageMapping("/chat.addUser")
    @SendTo("/topic/public") //将返回的消息发送给所有订阅了 "/topic/public" 主题的客户端
    public ChatMessage addUser(@Payload ChatMessage chatMessage, 
                               SimpMessageHeaderAccessor headerAccessor) {
        // 添加 username到 WebSocket session
        headerAccessor.getSessionAttributes().put("username", chatMessage.getSender());
        return chatMessage;
    }

    @MessageMapping("/trade")
    @SendToUser("/queue/user") //将返回的消息发送给订阅了 "/queue/user" 主题的 指定用户的客户端 如：/queue/user-user1
    public ChatMessage sendUserMsg(@Payload ChatMessage chatMessage,
                                   SimpMessageHeaderAccessor headerAccessor, Principal principal) {
        // 添加 username到 WebSocket session
        headerAccessor.getSessionAttributes().put("username", chatMessage.getSender());
        return chatMessage;
    }
}
